﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EntityModel;

namespace GUIServerConnectorAPI
{
    /// <summary>
    /// The IManagerInterface provides functionality for user management. This interface shall be used only
    /// by users with MANAGER role, only for the purpose of user management and not for other functionalities
    /// derived from the high level of permissions granted to users with MANAGER role.
    /// </summary>
    public interface IManagerInterface
    {
        /// <summary>
        /// Used by the manager to add data for a new pacient
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="pacient">The data for the pacient to add</param>
        void addPacient(Guid sessionId, Pacient pacient);

        /// <summary>
        /// Used by the manager to update data for an exsting pacient
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="pacient">The data for the pacient to update</param>
        void updatePacient(Guid sessionId, Pacient pacient);

        /// <summary>
        /// Used by the manager to remove data for an existing pacient
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="pacientId">The ID of the pacient to remove</param>
        void removePacient(Guid sessionId, Guid pacientId);

        /// <summary>
        /// Used by the manager to acquire data for all currently registered pacients
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <returns>The list of Pacient objects containing the data for all currently registered pacients</returns>
        List<Pacient> getPacients(Guid sessionId);

        /// <summary>
        /// Used by the manager to acquire data for a specific pacient
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="pacientId">The ID of the pacient for whom data should be retrieved</param>
        /// <returns>The Pacient object containing the data for the specified pacient</returns>
        Pacient getPacient(Guid sessionId, Guid pacientId);

        /// <summary>
        /// Used by the manager to add data for a new caregiver
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="ingrijitor">The data for the caregiver to add</param>
        void addIngrijitor(Guid sessionId, Ingrijitor ingrijitor);

        /// <summary>
        /// Used by the manager to update data for an existing caregiver
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="ingrijitor">The data for the caregiver to update</param>
        void updateIngrijitor(Guid sessionId, Ingrijitor ingrijitor);

        /// <summary>
        /// Used by the manager to remove data for an existing caregiver
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="ingrijitorId">The ID of the caregiver to remove</param>
        void removeIngrijitor(Guid sessionId, Guid ingrijitorId);

        /// <summary>
        /// Used by the manager to acquire data for all currently registered caregivers
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <returns>The list of Ingrijitor objects containing the data for all currently registered caregivers</returns>
        List<Ingrijitor> getIngrijitors(Guid sessionId);

        /// <summary>
        /// Used by the manager to acquire data for a specific caregiver
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="ingrijitorId">The ID of the caregiver for whom data should be retrieved</param>
        /// <returns>The Ingrijitor object containing the data for the specified caregiver</returns>
        Ingrijitor getIngrijitor(Guid sessionId, Guid ingrijitorId);

        /// <summary>
        /// Used by the manager to add data for a new superviser
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="supraveghetor">The data for the superviser to add</param>
        void addSupraveghetor(Guid sessionId, Supraveghetor supraveghetor);

        /// <summary>
        /// Used by the manager to update data for an existing superviser
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="supraveghetor">The data for the superviser to update</param>
        void updateSupraveghetor(Guid sessionId, Supraveghetor supraveghetor);

        /// <summary>
        /// Used by the manager to remove data for an existing superviser
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="supraveghetorId">The ID of the superviser to remove</param>
        void removeSupraveghetor(Guid sessionId, Guid supraveghetorId);

        /// <summary>
        /// Used by the manager to acquire data for all currently registered supervisers
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <returns>The list of Supraveghetor objects containing the data for all currently registered supervisers</returns>
        List<Supraveghetor> getSupraveghetors(Guid sessionId);

        /// <summary>
        /// Used by the manager to acquire data for a specific superviser
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="supraveghetorId">The ID of the superviser for whom data should be retrieved</param>
        /// <returns>The Supraveghetor object containing the data for the specified superviser</returns>
        Supraveghetor getSupraveghetor(Guid sessionId, Guid supraveghetorId);

        /// <summary>
        /// Used by the manager to add data for a new doctor
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="medic">The data for the doctor to add</param>
        void addMedic(Guid sessionId, Medic medic);

        /// <summary>
        /// Used by the manager to update data for an existing doctor
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="medic">The data for the doctor to update</param>
        void updateMedic(Guid sessionId, Medic medic);

        /// <summary>
        /// Used by the manager to remove data for an existing doctor
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="medicId">The ID of the doctor to remove</param>
        void removeMedic(Guid sessionId, Guid medicId);

        /// <summary>
        /// Used by the manager to acquire data for all currently registered doctors
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <returns>The list of Medic objects containing data for all currently registered doctors</returns>
        List<Medic> getMedics(Guid sessionId);

        /// <summary>
        /// Used by the manager to acquire data for a specific doctor
        /// </summary>
        /// <param name="sessionId">The ID of the active session</param>
        /// <param name="medicId">The ID of the doctor for whom data should be retrieved</param>
        /// <returns>The Medic object containing data for the specified doctor</returns>
        Medic getMedic(Guid sessionId, Guid medicId);
    }
}
